<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>函数递归的使用(The use of recursive functions)</title>
  <!-- 
  JavaScript 中的递归函数(recursive Function)使用说明
  递归函数是指在函数内部调用自身的函数。它通常用于解决可以被分解为更小的相同问题的问题。

  1. 递归的基本结构
    function recursiveFunction(parameters) {
      // 基本情况：停止递归的条件
      if (baseCondition) {
        return baseValue;
      }
      // 递归调用
      return recursiveFunction(modifiedParameters);
    }

  2. 关键要素
  - 基本情况（Base Case）：
    - 防止无限递归的条件。
    - 当满足某个条件时，函数将不再调用自身，直接返回结果。

  - 递归调用（Recursive Call）：
    - 在函数内部调用自身，通常会传入修改过的参数。
    - 每次递归调用都应朝着基本情况的方向发展。

  3. 递归示例
  - 计算阶乘：
    function factorial(n) {
      if (n === 0) { // 基本情况
        return 1;
      }
      return n * factorial(n - 1); // 递归调用
    }
  - 斐波那契数列：
    function fibonacci(n) {
      if (n <= 1) { // 基本情况
        return n;
      }
      return fibonacci(n - 1) + fibonacci(n - 2); // 递归调用
    }
      
  4. 优缺点
  - 优点：
    - 代码简洁，易于理解。
    - 适合处理分治法问题，如树结构、图遍历等。

  - 缺点：
    - 可能导致栈溢出（Stack Overflow）错误，特别是在递归深度较大时。
    - 性能较低，尤其是像斐波那契数列这样没有优化的递归。

  5. 注意事项
  - 在编写递归函数时，务必确保有明确的基本情况。
  - 对于性能敏感的场景，可以考虑使用尾递归或其他优化技术。
  - 了解递归的深度和可能的栈限制，以避免运行时错误。

  总结
  递归函数是一个强大的工具，适用于许多算法问题。正确使用递归可以使代码简洁且易于维护，但也要注意其可能带来的性能问题和栈溢出风险。
   -->
</head>
<body>

  <script>
    // 1.  递归函数的基本结构
    function recursiveFunction(parameters) {
      // 基本情况：停止递归的条件
      if (baseCondition) {
        return baseValue;
      }
      // 递归调用
      return recursiveFunction(modifiedParameters);
    }

    // 2.  防止无限递归的条件
    // 递归函数必须有一个明确的结束条件，以防止无限递归。
    // 例如，计算阶乘的递归函数可以定义为：
    function factorial(n) {
      if (n === 0) { // 基本情况
        return 1;
      }
      return n * factorial(n - 1); // 递归调用
    }
    console.log("2.  防止无限递归的条件", factorial(5)); // 输出 120

    // 3.  斐波那契数列
    function fibonacci(n) {
      if (n <= 1) { // 基本情况
        return n;
      }
      return fibonacci(n - 1) + fibonacci(n - 2); // 递归调用
    }
    console.log("3.  斐波那契数列", fibonacci(15)); // 输出 610




  </script>
  
</body>
</html>